import 'package:flutter/material.dart';

// 文本折叠动画组件（默认显示 maxLines 行，点击展开全部）
class ExpandableText extends StatefulWidget {
  final String text;
  final int showLines; // 默认显示行数
  final TextStyle? style;
  final bool isExpand;// 是否展开

  const ExpandableText({
    super.key,
    required this.text,
    this.showLines = 5,
    this.style, 
    this.isExpand = false, 
  });

  @override
  State<ExpandableText> createState() => _ExpandableTextState();
}

class _ExpandableTextState extends State<ExpandableText>
    with SingleTickerProviderStateMixin {
  late AnimationController _controller;
  late Animation<double> _heightFactor;

  @override
  void initState() {
    super.initState();
    // 动画控制器
    _controller = AnimationController(
      duration: const Duration(milliseconds: 300),
      vsync: this,
    );
    // 高度因子(从 0.0 到 1.0 的数值动画)
    _heightFactor = Tween<double>(begin: 0.0, end: 1.0).animate(
      CurvedAnimation(//  动画曲线
        parent: _controller, // 动画控制器
        curve: Curves.easeInOut,// 缓入缓出效果
      ),
    );

  }
  @override
  void didUpdateWidget(covariant ExpandableText oldWidget) {
    super.didUpdateWidget(oldWidget);
    print('父组件状态发生改变${oldWidget.isExpand}');
     if (oldWidget.isExpand != widget.isExpand) {
      if (widget.isExpand) {
        _controller.forward(); // 展开动画
      } else {
        _controller.reverse(); // 折叠动画
      }
    }
  }
  @override
  void dispose() {
    _controller.dispose();
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    return Column(
      crossAxisAlignment: CrossAxisAlignment.start,
      children: [
        // 全部显示的文本容器
        ClipRect(
          child: SizeTransition(
            sizeFactor: _heightFactor,// 控制大小的动画因子
            axis: Axis.vertical,// 指定动画作用的轴为垂直方向（Y 轴）
            child: Text(
              widget.text,
              maxLines:null,
              style: widget.style ?? const TextStyle(fontSize: 16),
            ),
          ),
        ),
        // 折叠文本显示 maxLines 行的文本（作为基础层）
        if(!widget.isExpand) Text(
          widget.text,
          maxLines: widget.showLines,// 最多显示 maxLines 行
          overflow: TextOverflow.ellipsis,
          style: widget.style ?? const TextStyle(fontSize: 16),
        ),
      ],
    );
  }
}